最近在看爬虫,也在看《河神》的小说,正好看到网上有个教程就是讲爬取小说的,于是就想照着试一试。
实验环境
Python :3.5.3
selenium :3.7.0
chrome :60.0.3112.90
phantomjs :2.1.1
坑点:在线阅读网不是直接爬html就可以的
参考教程如下:
http://www.cuijiahua.com/blog/2017/10/spider_tutorial_1.html
原文中的例子:
|
|
当时我只看了第一部分的静态数据爬取,一开始照着requests+BeautifulSoup的方法就爬到了一些内容,当时还美滋滋呢。
爬到的内容:
|
|
后来仔细一看,不对啊,开头怎么不是熟悉的“九河下梢天津卫,两道浮桥三道关”呢!
然后用谷歌浏览器查看了之后才发现,查看到的内容和之前直接爬的源代码内容根本就不一样啊。
估计是这些在线阅读网站的防复制机制,它的Elements当中的文章段落也是乱序的,有很多的冗余段落,是按照从当前开始,向下数的第6个段落才是真正的下一段。
|
|
转向selenium
于是就开始查找如何爬到Elements
先安装selenium,pip安装即可。一开始我选择的是Chrome浏览器,即webdriver.Chrome
selenium+Chrome
下载chromedriver
要对应自己的chrome浏览器,可以在网上找到对应规则
http://chromedriver.storage.googleapis.com/index.html?path=2.33/
使用时这里要注意地址是chromedriver.exe的,不是chrome.exe!
http://bbs.csdn.net/topics/391982455
|
|
目前的代码
|
|
然而,虽然这下子的结果是正确的了,但是却不全。
|
|
后来查看了body内容 发现也是这么少,但是出现了“继续加载”这样的字样,想到了浏览器是在向下滚的过程中加载更多的文字的,即网页其实是动态的。
selenium+phantomjs
下面要解决的问题就是,如何模拟出鼠标的滚动效果,使得爬到的内容是完整的。接着在网上找办法,看到有人说phantojs非常好用,于是就改变了策略。
phantomjs官网
http://phantomjs.org/download.html
但是官网下载速度很慢,可以去一些软件之家之类的网站下载,速度比它快太多了。
安装好后,模拟出鼠标滚轮的效果:
browser.execute_script(“window.scrollTo(0,document.body.scrollHeight)”)
可以使爬到的数据变多,但还不是全部的,不过通过多次滚动后可以得到全部的内容
目前的代码
|
|
这下就可以获取到单独一章的完整内容啦。
批量下载
小说的首页是:http://www.99lib.net/book/3489/index.htm
可以在这里获取到全书的链接,不过这里需要点击才能查看全部章节,可以用click()实现。
不过后来我发现直接获取网页的html也挺方便的。
可以看出目录的id=”dir”,我们就可以通过这个来找到目录地址的表了:
|
|
经过整理之后得到各个章节的地址,当前代码为:
|
|
得到的结果:
第一章 闸桥底下的水怪 http://www.99lib.net//book/3489/118172.htm
第二章 魏家坟镜子阵 http://www.99lib.net//book/3489/118173.htm
…
这下就离成功不远啦,只要把之前下载单个目录的方法重复就好了。
最终代码
|
|
第一次写爬虫没啥经验,没有使用多线程之类的提高效率,每个章节大概是20KB,最后下载完成整本书大概要3分钟。